package com.uqbar.metalGear;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;

import com.uqbar.vainilla.GameScene;

import componentes.Bloque;
import componentes.Componente;
import componentes.Contenedor;
import componentes.Coordenada;
import componentes.Espera;
import componentes.Fondo;
import componentes.Llegada;
import componentes.Personaje;
import componentes.Soldado;
import componentes.Vision;
import comportamiento.Abajo;
import comportamiento.Arriba;
import comportamiento.ControlesPJ;
import comportamiento.Derecha;
import comportamiento.Izquierda;
import comportamiento.Recorrido;
import comportamiento.RecorridoDos;

public class MGSScene extends GameScene{
	
	private Fondo fondo;
	private Personaje pj;
	private Llegada llegada;
	private ArrayList<Vision> conos = new ArrayList<Vision>();
	private ArrayList<Soldado> soldados = new ArrayList<Soldado>();
	private ArrayList<Espera> esperas = new ArrayList<Espera>();
	private ArrayList<Componente> componentes = new ArrayList<Componente>();
	private ArrayList<Fondo> fondos = new ArrayList<Fondo>();
	
	public MGSScene(){
		super();
		
		ControlesPJ controles = new ControlesPJ();
		double velocidad = 150;
		double velocidadSoldado = 60;
		int maxEspera = 800;
	    
		// fondos
		
		BufferedImage imgFondoNegro = this.cargarImagen("imagenes/fondoNegro.PNG");
	    Fondo fondoNegro = new Fondo(-300, -1900, imgFondoNegro, controles, velocidad );
		
	    BufferedImage imgFondo = this.cargarImagen("imagenes/cargoDock5.PNG");
	    Fondo fondo = new Fondo(200, -1450, imgFondo, controles, velocidad );
	    
	    // llegada
	    
	    BufferedImage imgLLegada = this.cargarImagen("imagenes/llegada.PNG");
	    Llegada llegada = new Llegada(778, -1450, imgLLegada, controles, velocidad);
	    
	    // contenedores
	    
	    BufferedImage imgCont = this.cargarImagen("imagenes/contenedores2.PNG");
	    Contenedor contenedores1 = new Contenedor(450, -1000, imgCont, controles, velocidad);
	    Contenedor contenedores2 = new Contenedor(850, -1000, imgCont, controles, velocidad);
	    Contenedor contenedores3 = new Contenedor(450, -600, imgCont, controles, velocidad);
	    Contenedor contenedores4 = new Contenedor(850, -600, imgCont, controles, velocidad);
	    
	    // paredes ///////////////////////////
	    
	    BufferedImage imgPared300 = this.cargarImagen("imagenes/pared300.PNG");
	    BufferedImage imgPared250 = this.cargarImagen("imagenes/pared250.PNG");
	    BufferedImage imgPared200 = this.cargarImagen("imagenes/pared200.PNG");
	    BufferedImage imgPared150 = this.cargarImagen("imagenes/pared150.PNG");
	    
	    BufferedImage imgPared300arriba = this.cargarImagen("imagenes/pared300arriba.PNG");
	    BufferedImage imgPared150arriba = this.cargarImagen("imagenes/pared150arriba.PNG");
	    BufferedImage imgPared100arriba = this.cargarImagen("imagenes/pared100arriba.PNG");
	    BufferedImage imgPared250arriba = this.cargarImagen("imagenes/pared250arriba.PNG");
	    
	    BufferedImage imgPared300der = this.cargarImagen("imagenes/pared300der.PNG");
	    BufferedImage imgPared150der = this.cargarImagen("imagenes/pared150der.PNG");
	    
	    Bloque pared1 = new Bloque(340, -1100, imgPared300, controles, velocidad);
	    Bloque pared2 = new Bloque(340, -800, imgPared300, controles, velocidad);
	    Bloque pared3 = new Bloque(340, -500, imgPared250, controles, velocidad);
	    Bloque pared4 = new Bloque(190, -250, imgPared300, controles, velocidad);
	    Bloque pared5 = new Bloque(190, 50, imgPared300, controles, velocidad);
	    Bloque pared6 = new Bloque(640, -1300, imgPared200, controles, velocidad);
	    
	    Bloque pared19 = new Bloque(190, 350, imgPared300, controles, velocidad);
	    
	    Bloque pared7 = new Bloque(350, -1110, imgPared300arriba, controles, velocidad);
	    Bloque pared8 = new Bloque(200, -250, imgPared150arriba, controles, velocidad);
	    Bloque pared9 = new Bloque(650, -1310, imgPared100arriba, controles, velocidad);
	    Bloque pared10 = new Bloque(1000, -1310, imgPared300arriba, controles, velocidad);
	    
	    Bloque pared11 = new Bloque(1300, -1300, imgPared300der, controles, velocidad);
	    Bloque pared12 = new Bloque(1300, -1000, imgPared300der, controles, velocidad);
	    Bloque pared13 = new Bloque(1300, -700, imgPared300der, controles, velocidad);
	    Bloque pared14 = new Bloque(1300, -400, imgPared300der, controles, velocidad);
	    Bloque pared15 = new Bloque(1300, -100, imgPared300der, controles, velocidad);
	    Bloque pared16 = new Bloque(1300, 200, imgPared300der, controles, velocidad);
	    
	    // paredes para el ascensor
	    Bloque pared17 = new Bloque(752, -1450, imgPared150, controles, velocidad);
	    Bloque pared18 = new Bloque(995, -1450, imgPared150der, controles, velocidad);
	    Bloque pared20 = new Bloque(753, -1460, imgPared250arriba, controles, velocidad);
	    
	    // Cajas y otros obstaculos
	    
	    BufferedImage imgForklift = this.cargarImagen("imagenes/forklift2.PNG");
	    Bloque forklift = new Bloque(1200, -1250, imgForklift, controles, velocidad); 
	    
	    BufferedImage imgCaja = this.cargarImagen("imagenes/caja.PNG");
	    BufferedImage imgCaja2 = this.cargarImagen("imagenes/caja2.PNG");
	    
	    Bloque caja1 = new Bloque(350, -1000, imgCaja, controles, velocidad);
	    Bloque caja2 = new Bloque(700, -300, imgCaja2, controles, velocidad);
	    
	    BufferedImage imgMetal = this.cargarImagen("imagenes/bloqueMetal.PNG");
	    
	    Bloque metal1 = new Bloque(220, -20, imgMetal, controles, velocidad);
	    Bloque metal2 = new Bloque(220, 130, imgMetal, controles, velocidad);
	    Bloque metal3 = new Bloque(1100, -100, imgMetal, controles, velocidad);
	    
	    BufferedImage imgTubo = this.cargarImagen("imagenes/tubo.PNG");
	    BufferedImage imgTuboH = this.cargarImagen("imagenes/tuboh.PNG");
	    BufferedImage imgTuboAgua = this.cargarImagen("imagenes/tuboAgua.PNG");
	    
	    Bloque tubo1 = new Bloque(230, 270, imgTuboAgua, controles, velocidad);
	    Bloque tubo2 = new Bloque(1150, 40, imgTuboAgua, controles, velocidad);
	    
	    // Barras
	    
	    BufferedImage imgBarra200izq = this.cargarImagen("imagenes/barra200izq.PNG");
	    BufferedImage imgBarra100izq = this.cargarImagen("imagenes/barra100izq.PNG");
	    BufferedImage imgBarra150 = this.cargarImagen("imagenes/barra150.PNG");
	    BufferedImage imgBarra200 = this.cargarImagen("imagenes/barra200.PNG");
	    BufferedImage imgBarra100 = this.cargarImagen("imagenes/barra100.PNG");
	    
	    Bloque barra1 = new Bloque(500, 50, imgBarra200izq, controles, velocidad);
	    Bloque barra2 = new Bloque(500, -150, imgBarra200izq, controles, velocidad);
	    Bloque barra3 = new Bloque(500, 250, imgBarra100izq, controles, velocidad);
	    
	    Bloque barra4 = new Bloque(1000, -150, imgBarra200izq, controles, velocidad);
	    Bloque barra5 = new Bloque(1000, 50, imgBarra100izq, controles, velocidad);
	    
	    Bloque barra6 = new Bloque(200, 345, imgBarra150, controles, velocidad);
	    Bloque barra7 = new Bloque(350, 345, imgBarra150, controles, velocidad);
	    
	    Bloque barra8 = new Bloque(500, -150, imgBarra200, controles, velocidad);
	    Bloque barra9 = new Bloque(700, -150, imgBarra200, controles, velocidad);
	    Bloque barra10 = new Bloque(900, -150, imgBarra100, controles, velocidad);
	    
	    Bloque barra11 = new Bloque(1000, 150, imgBarra150, controles, velocidad);
	    Bloque barra12 = new Bloque(1150, 150, imgBarra150, controles, velocidad);	    
	    
	    // esperas y soldados
	    
	    Izquierda izquierda = new Izquierda();
	    Derecha derecha = new Derecha();
	    Arriba arriba = new Arriba();
	    Abajo abajo = new Abajo();
	    
	    BufferedImage imgEsp = this.cargarImagen("imagenes/puntoTransparente.PNG");
	    //BufferedImage imgEsp = this.cargarImagen("imagenes/puntoDeEspera.PNG");
	    //BufferedImage imgEsp = this.cargarImagen("imagenes/puntito.PNG");
	    
	    Espera espera1 = new Espera(400, -1060, imgEsp, controles, velocidad);
	    Espera espera2 = new Espera(1200, -1060, imgEsp, controles, velocidad);
	    
	    Espera espera3 = new Espera(400, -200, imgEsp, controles, velocidad);
	    Espera espera4 = new Espera(400, -900, imgEsp, controles, velocidad);
	    
	    Espera espera5 = new Espera(600, -200, imgEsp, controles, velocidad);
	    Espera espera6 = new Espera(1200, -200, imgEsp, controles, velocidad);
	    
	    Espera espera7 = new Espera(800, -650, imgEsp, controles, velocidad);
	    Espera espera8 = new Espera(1200, -650, imgEsp, controles, velocidad);
	    
	    RecorridoDos recorrido = new RecorridoDos(maxEspera);
	    RecorridoDos recorrido2 = new RecorridoDos(maxEspera);
	    RecorridoDos recorrido3 = new RecorridoDos(maxEspera);
	    RecorridoDos recorrido4 = new RecorridoDos(maxEspera);
	    
	    BufferedImage imgPJ = this.cargarImagen("imagenes/down2.PNG");
	    BufferedImage imgSoldado = this.cargarImagen("imagenes/soldadito.PNG");	
	    
	    ArrayList<Espera> esp1 = new ArrayList<Espera>();
	    esp1.add(espera1);
	    esp1.add(espera2);
	    
	    ArrayList<Espera> esp2 = new ArrayList<Espera>();
	    esp2.add(espera3);
	    esp2.add(espera4);
	    
	    ArrayList<Espera> esp3 = new ArrayList<Espera>();
	    esp3.add(espera5);
	    esp3.add(espera6);
	    
	    ArrayList<Espera> esp4 = new ArrayList<Espera>();
	    esp4.add(espera7);
	    esp4.add(espera8);
	    
	    Soldado soldado1 = new Soldado(1160, -1070, imgSoldado, velocidad, controles, velocidadSoldado, izquierda, recorrido, esp1);
	    Soldado soldado2 = new Soldado(385, -500, imgSoldado, velocidad, controles, velocidadSoldado, abajo, recorrido2, esp2);
	    Soldado soldado3 = new Soldado(700, -220, imgSoldado, velocidad, controles, velocidadSoldado, derecha, recorrido3, esp3);
	    Soldado soldado4 = new Soldado(850, -670, imgSoldado, velocidad, controles, velocidadSoldado, derecha, recorrido4, esp4);
	    
	    // conos de vision
	    
	    double anguloAbajo = 225;
	    double anguloArriba = 45;
	    double anguloIzquierda = 135;
	    double anguloDerecha = 315;
	    Color color = new Color(0f,1f,1f,.3f);
	    Vision vision1 = new Vision(315, 220, color, 200, anguloIzquierda, 90, soldado1);
	    Vision vision2 = new Vision(315, 220, color, 200, anguloAbajo, 90, soldado2);
	    Vision vision3 = new Vision(315, 220, color, 200, anguloDerecha, 90, soldado3);
	    Vision vision4 = new Vision(315, 220, color, 200, anguloDerecha, 90, soldado4);
	    
	    // seteos //////////////////////////////////////////////////////////
	    
	    this.setFondo(fondoNegro);
	    this.setFondo(fondo);
	    
	    this.setLlegada(llegada);
	    
	    this.setCont(contenedores1);
	    this.setCont(contenedores2);
	    this.setCont(contenedores3);
	    this.setCont(contenedores4);
	    
	    this.setBloque(forklift);
	    
	    // paredes /////////////
	    this.setBloque(pared1);
	    this.setBloque(pared2);
	    this.setBloque(pared3);
	    this.setBloque(pared4);
	    this.setBloque(pared5);
	    this.setBloque(pared6);
	    this.setBloque(pared7);
	    this.setBloque(pared8);
	    this.setBloque(pared9);
	    this.setBloque(pared10);
	    this.setBloque(pared11);
	    this.setBloque(pared12);
	    this.setBloque(pared13);
	    this.setBloque(pared14);
	    this.setBloque(pared15);
	    this.setBloque(pared16);
	    
	    this.setBloque(pared17);
	    this.setBloque(pared18);
	    this.setBloque(pared20);
	    
	    this.setBloque(pared19);
	    
	    // cajas y cositas
	    
	    this.setBloque(caja1);
	    this.setBloque(caja2);
	    
	    this.setBloque(metal1);
	    this.setBloque(metal2);
	    this.setBloque(tubo1);
	    
	    this.setBloque(metal3);
	    this.setBloque(tubo2);
	    // barras
	    
	    this.setBloque(barra1);
	    this.setBloque(barra2);
	    this.setBloque(barra3);
	    this.setBloque(barra4);
	    this.setBloque(barra5);
	    this.setBloque(barra6);
	    this.setBloque(barra7);
	    this.setBloque(barra8);
	    this.setBloque(barra9);
	    this.setBloque(barra10);
	    this.setBloque(barra11);
	    this.setBloque(barra12);
	    
	    // esperas y soldados
	    
	    this.setEspera(espera1);
	    this.setEspera(espera2);
	    this.setEspera(espera3);
	    this.setEspera(espera4);
	    this.setEspera(espera5);
	    this.setEspera(espera6);
	    this.setEspera(espera7);
	    this.setEspera(espera8);
	    
	    this.setSoldado(soldado1);
	    this.setSoldado(soldado2);
	    this.setSoldado(soldado3);
	    this.setSoldado(soldado4);
	    
	    this.setVision(vision1);
	    this.setVision(vision2);
	    this.setVision(vision3);
	    this.setVision(vision4);
	    
	    Personaje personaje = new Personaje(400, 300, imgPJ, velocidad, controles);

	    this.setPj(personaje);
	}
	
	public BufferedImage cargarImagen(String ruta){
		
		BufferedImage img = null;
		try {
	    	img = ImageIO.read(new File(ruta));
	    }
	    catch (IOException ex) {
	    	System.out.println("No se pudo leer la imagen para " + ruta);
	    }
		return img;
	}
	
	// accesos ////////////////////////////////////////////////////
	
	public Fondo getFondo(){
		return fondo;
	}
	
	public void setFondo(Fondo fondo){
		this.addComponent(fondo);
		this.fondos.add(fondo);
		this.fondo = fondo;
	}

	public Personaje getPj() {
		return pj;
	}

	public void setPj(Personaje pj) {
		this.addComponent(pj);
		this.pj = pj;
	}

	public void setCont(Contenedor cont) {
		this.componentes.add(cont);
		this.addComponent(cont);
	}
	
	public void setBloque(Bloque bloque){
		this.componentes.add(bloque);
		this.addComponent(bloque);
	}

	public ArrayList<Componente> getComponentes() {
		return componentes;
	}

	public void setComponentes(ArrayList<Componente> componentes) {
		this.componentes = componentes;
	}

	public void setSoldado(Soldado soldado) {
		this.soldados.add(soldado);
		this.addComponent(soldado);
	}

	public ArrayList<Soldado> getSoldados() {
		return soldados;
	}

	public void setSoldados(ArrayList<Soldado> soldados) {
		this.soldados = soldados;
	}

	public void setEspera(Espera espera) {
		this.esperas.add(espera);
		this.addComponent(espera);
	}

	public ArrayList<Espera> getEsperas() {
		return esperas;
	}

	public void setEsperas(ArrayList<Espera> esperas) {
		this.esperas = esperas;
	}
	
	public void setVision(Vision vision){
		this.conos.add(vision);
		this.addComponent(vision);
	}

	public ArrayList<Vision> getConos() {
		return conos;
	}

	public void setConos(ArrayList<Vision> conos) {
		this.conos = conos;
	}

	public ArrayList<Fondo> getFondos() {
		return fondos;
	}

	public void setFondos(ArrayList<Fondo> fondos) {
		this.fondos = fondos;
	}

	public Llegada getLlegada() {
		return llegada;
	}

	public void setLlegada(Llegada llegada) {
		this.llegada = llegada;
		this.addComponent(llegada);
	}
	
}
